package com.geekhole.demo.user.application.v2.service.base;

import com.geekhole.demo.user.domain.Agg;
import com.geekhole.demo.user.domain.DomainServiceContext;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.data.repository.CrudRepository;

public abstract class AbstractCreateService<AGG extends Agg, CONTEXT extends DomainServiceContext>
        extends AbstractDomainService<AGG, CONTEXT>{

    public AbstractCreateService(CrudRepository<AGG, ?> repository, ApplicationEventPublisher eventPublisher) {
        super(repository, eventPublisher);
    }

    /**
     * 重写父类方法，进行扩展
     * @param context
     * @return
     */
    @Override
    protected AGG doHandle(CONTEXT context) {
        // 1. 生成 聚合根
        AGG agg = instance(context);

        // 2. 执行业务访问
        update(agg, context);

        return agg;
    }

    /**
     * 子类扩展点，可以对 聚合 进行业务调用
     * @param agg
     * @param context
     */
    protected void update(AGG agg, CONTEXT context){

    }

    /**
     * 子类扩展点，对 聚合 进行实例化
     * @param context
     * @return
     */
    protected abstract AGG instance(CONTEXT context);

}
